package com.aviatorscript.aviatorscript.mapper;

import com.aviatorscript.aviatorscript.entity.TransformRule;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 转换规则Mapper接口
 * 继承MyBatis-Plus的BaseMapper，提供基础的CRUD操作
 */
@Mapper
public interface TransformRuleMapper extends BaseMapper<TransformRule> {

    /**
     * 根据规则编码查询转换规则
     * @param ruleCode 规则编码
     * @return 转换规则
     */
    TransformRule selectByRuleCode(@Param("ruleCode") String ruleCode);

    /**
     * 查询启用状态的转换规则列表
     * @return 启用的转换规则列表
     */
    List<TransformRule> selectEnabledRules();

    /**
     * 根据源类型和目标类型查询转换规则
     * @param sourceType 源类型
     * @param targetType 目标类型
     * @return 转换规则列表
     */
    List<TransformRule> selectBySourceAndTargetType(@Param("sourceType") String sourceType, 
                                                   @Param("targetType") String targetType);

    /**
     * 更新规则的编译状态
     * @param id 规则ID
     * @param compileStatus 编译状态
     * @return 更新影响行数
     */
    @Update("UPDATE transform_rule SET compile_status = #{compileStatus}, version = version + 1, update_time = NOW() WHERE id = #{id}")
    int updateCompileStatus(@Param("id") Long id, @Param("compileStatus") Boolean compileStatus);

    /**
     * 更新规则执行统计信息
     * @param id 规则ID
     * @param executeCount 执行次数
     * @param lastExecuteTime 最后执行时间
     * @return 更新影响行数
     */
    @Update("UPDATE transform_rule SET execute_count = #{executeCount}, last_execute_time = #{lastExecuteTime}, update_time = NOW() WHERE id = #{id}")
    int updateExecuteStatistics(@Param("id") Long id, 
                               @Param("executeCount") Long executeCount, 
                               @Param("lastExecuteTime") LocalDateTime lastExecuteTime);

    /**
     * 增加规则执行次数
     * @param id 规则ID
     * @return 更新影响行数
     */
    @Update("UPDATE transform_rule SET execute_count = execute_count + 1, last_execute_time = NOW(), update_time = NOW() WHERE id = #{id}")
    int incrementExecuteCount(@Param("id") Long id);

    /**
     * 更新规则版本号（用于缓存失效）
     * @param id 规则ID
     * @return 更新影响行数
     */
    @Update("UPDATE transform_rule SET version = version + 1, update_time = NOW() WHERE id = #{id}")
    int incrementVersion(@Param("id") Long id);
} 